Авторам, создающим новые распространяемые компоненты, необходимо использовать технологии разделения смежных компонентов с тем, чтобы эти компоненты можно было установить в каталог приложения.
Термин «смежные» означает, что версия 1 данного компонента работает в одном процессе, в то время как версия 2 работает в другом процессе. Состояние каждой версии должно быть изолировано, чтобы она не вступала в противоречие с другими версиями. Приведенные ниже правила помогут гарантировать работу Ваших компонентов по сценарию смежных. В большинстве случаев в обычные компоненты необходимо внести незначительные изменения, чтобы они соответствовали этим требованиям.
Для создания смежного компонента:
Не регистрируйте полные имена путей для регистраций COM. Операционная система найдет все зависимые компоненты в данном каталоге приложения.
Если метаданные COM (например, последовательная модель) отличаются в разных версиях, откройте в новой версии новый GUID.
Библиотеки типов должны содержаться в Вашей DLL, а не в отдельном файле. Для загрузки библиотек типов используйте функцию LoadTypeLib, а не LoadRegTypeLib.
Необходимо следить за числом GUID: Удаление смежного компонента не должно удалять его GUID из реестра, так как другое приложение, использующее этот компонент, может зависеть от него.
Настройки реестра должны быть определены для каждой версии. Например, храните состояние реестра в параметрах с использованием следующих условных обозначений имен
HKCU\MyCompany\MyComponent\VersionXXXX\
Другие глобальные хранилища должны быть определены для каждой версии, если данные в разных версиях разные:
Для каждой версии данного компонента необходимо разработать различные структуры совместного использования данных, такие как файлы распределенной памяти, переключатели, именованные каналы и аппаратные драйверы, чтобы различные версии этого компонента могли работать одновременно.
Файлы распределенной памяти и совместно используемые файлы необходимо использовать либо отдельно для каждой версии компонента, либо иметь ключи версии внутри файла, с тем чтобы различные версии данного компонента могли получать к ним доступ одновременно.
Замечание: Совместное использование смежных компонентов поддерживается в системе Windows 2000 и Windows 98 Second Edition. Для предыдущих версий операционной системы Windows активизация смежных компонентов не поддерживается. Однако смежная DLL может быть написана так, чтобы она устанавливалась на платформах более низкого уровня в системном каталоге и работала в форме глобального совместного использования (обратная совместимость). Смежные DLL должны быть установлены в системном каталоге на этих платформах и в каталоге приложения в Windows 2000 и Windows 98 Second Edition. Приложения должны динамически проверять операционную систему, чтобы определить, какую технологию совместного использования необходимо использовать. В приведенном ниже коде выполняется проверка, поддерживается ли совместное использование смежных компонентов:
BOOL bPlatformSupportsSideBySide(void) { OSVERSIONINFOEX osviex ; osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); // Если платформа не поддерживает структуру OSVERSIONINFOEX, она не // имеет поддержки смежных компонентов. // if (!GetVersionEx((OSVERSIONINFO *)&osviex)) { return FALSE ; // нет перенаправлений DLL } // Однако, что касается NT, то в NT4 SP4 имелась поддержка OSVERSIONINFOEX, // но не было поддержки перенаправления DLL. // Если перенаправление DLL появится в следующей версии NT4 SP, то этот код // нужно будет обновить. // if ( (osviex.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osviex.dwMajorVersion < 5) ) { return FALSE ; } // Предполагается, что для других ИД платформ имеется поддержка смежных компонентов return TRUE ; }